package com.example.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    /**
     * 这里有四个序列化器：
     * 1，keySerializer 是处理所有 redis 结构的 key（包括 hash）, 一般都是字符串
     * 2，valueSerializer 是处理几乎所有 redis 结构的 value（string，list，set，zset）
     * 3，hashKeySerializer 是处理 hash<field, value> 中的 field, 一般都是字符串
     * 4，hashValueSerializer 是处理 hash<field, value> 中的 value
     *
     * 解释：
     * 为什么没有专门的 List、Set、Sorted Set 序列化器？
     * 这是因为：
     * List、Set、Sorted Set 的 Value 是集合类型，它们的存储本质上是多个 Value 的组合。
     * 例如，List 是一个有序的 Value 列表，Set 是一个无序的 Value 集合。
     * 因此，它们的序列化方式可以直接复用 valueSerializer 来处理每个元素。
     * Key 的存储方式始终是字符串，所以不需要为 List、Set、Sorted Set 单独定义 Key 的序列化器。
     *
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        // 设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);

        return redisTemplate;
    }
}
